<?php

include('../../include/functions.inc.php');
if (!isEmpty(getParam('operation'))) {
    switch (getParam('operation')) {
        case 'anula':
            anulaInvoice($db, $user);
            break;
    }
}

function permitidoAnular($db, $fechaFac) {
    $dia = date("d", strtotime($fechaFac));
    $mes = date("m", strtotime($fechaFac));
    $anio = date("Y", strtotime($fechaFac));
    $where = "DIA=" . $dia . " AND MES=" . $mes . " AND YEAR=" . $anio . " AND STATUS=1";
    $res = $db->query_select("cllg_cierre", $where);
    if (count($res) > 0) {  //ESTA DENTRO DE UN PERIODO CERRADO
        return FALSE;
    }
    return TRUE;
}

function anulaInvoice($db, $user) {
    $numero = sqlValue(getParam("NUMERO"), "int");
    $serie = sqlValue(getParam("SERIE"), "text");
    $strSerie = getParam("SERIE");
    $f = $db->query_select("cllg_factura", "NUMERO=$numero AND SERIE=$serie AND (STATUS=1 OR STATUS=2)");
    if (count($f) > 0) {
        $idF = $f[0]["ID"];
        if (permitidoAnular($db, $f[0]["FECHA"])) {
            $c = $db->query_select("cllg_mov_cargo", "FK_FACTURA=$idF");
            if( count($c) > 0 ) {
                foreach ($c as $m) {
                    //busca cargo a modificar
                    $cargo = $db->query_select("cllg_cargo", "ID=" . $m["FK_CARGO"]);
                    $cargo = $cargo[0];
                    $monto = $cargo["TOTAL_PENDIENTE"] + $m["MONTO"];
                    if ($cargo["TIPO_CARGO"] == 'M') {
                        //reversa el monto en el cargo
                        $db->query_update("cllg_cargo", array("TOTAL_PENDIENTE" => sqlValue($monto, "double"),
                            "DATE_PAYED" => sqlValue("", "date")), "ID=" . sqlValue($m["FK_CARGO"], "int"));

                        $intCiclo = 0;
                        $strQuery = "SELECT  cllg_student_assign.FK_CYCLE
                                    FROM    cllg_cargo,
                                            cllg_student_assign
                                    WHERE   cllg_cargo.ID = {$m["FK_CARGO"]}
                                    AND     cllg_cargo.FK_STUDENT_ASSIGN = cllg_student_assign.ID";
                        $db->query($strQuery);
                        while ($arrFila = $db->fetch_assoc()) {
                            $intCiclo = $arrFila['FK_CYCLE'];
                        }
                        $db->free_result($db->query_id);
                        if ($intCiclo > 0) {
                            $strQuery = "UPDATE cllg_college_cycle SET MONEY_IN = MONEY_IN - {$m["MONTO"]} WHERE CODE = {$intCiclo} AND FK_ENTITY = " . $user->entity;
                            $db->query($strQuery);
                        }
                    } else {
                        //Si es un cargo automatico solo se le cambia el estado a anulada
                        $db->query_update("cllg_cargo", array("STATUS" => sqlValue("0", "int")), "ID=" . sqlValue($m["FK_CARGO"], "int"));
                    }

                    //anula el abono
                    $db->query_update("cllg_abono", array("STATUS" => sqlValue("0", "int")), "ID=" . sqlValue($m["FK_ABONO"], "int"));
                    //actualiza los saldos de cuenta corriente
                    $ac = $db->query_select("cllg_account", "ID=" . $cargo["FK_ACCOUNT"]);
                    $ac = $ac[0];
                    $cbalance = $ac["CURR_BALANCE"] + $monto;
                    $pbalance = $ac["CURR_BALANCE"];
                    $db->query_update("cllg_account", array("CURR_BALANCE" => sqlValue($cbalance, "double"),
                        "PREV_BALANCE" => sqlValue($pbalance, "double")), "ID=" . sqlValue($ac["ID"], "int"));
                }
            }
            //finalmente anula factura
            $db->query_update("cllg_factura", array("STATUS" => sqlValue("0", "int")), "ID=" . sqlValue($idF, "int"));
            echo "La factura serie {$strSerie} numero {$numero} ha sido anulada.";
        } else {
            echo "No fue posible anular factura, ya se hizo el cierre respectivo. \n";
            echo "Fecha de Cierre: " . $f[0]["FECHA"];
        }
    }
    else {
        $fa = $db->query_select("cllg_factura", "NUMERO = $numero AND SERIE = $serie AND STATUS = 0");
        if( count($fa) > 0 ) {
            echo "La factura serie {$strSerie} numero {$numero} ya esta anulada.";
        }
        else {
            echo "La factura serie {$strSerie} numero {$numero} no existe.";
        }
    }
}

?>